#ifndef EVENT_FSM_H
#define EVENT_FSM_H
#include "public.h"





#define soft_timer_t void *                        // 定义软定时器类型为void指针类型，可以根据实际需要定义具体的软定时器结构体
#define soft_timer_init(timer, interval, callback) // 软定时器初始化宏，具体实现根据实际需要定义
#define soft_timer_start(timer,delay) // 启动软定时器宏，具体实现根据实际需要定义
#define soft_timer_stop(timer)      // 停止软定时器宏，具体实现根据实际需要定义

#define ringbuf_t void *      // 定义环形缓冲区类型为void指针类型，可以根据实际需要定义具体的环形缓冲区结构体
#define ringbuf_init(size)    // 环形缓冲区初始化宏，具体实现根据实际需要定义
#define ringbuf_put(rb, data) // 环形缓冲区写入数据宏，具体实现根据实际需要定义
#define ringbuf_get(rb, data) // 环形缓冲区读取数据宏，具体实现根据实际需要定义

typedef int (*event_fsm_handler_t)(void *fsm);
typedef void (*event_fsm_evt_handler_t)(uint32_t evt, void *user_data);

typedef struct event_fsm_evt
{
    uint8_t evt;                     // 事件类型
    event_fsm_evt_handler_t handler; // 事件处理函数
} _event_fsm_evt, *event_fsm_evt_t;
typedef enum
{
    FSM_STATE_IDLE = 0, // 空闲状态
    FSM_STATE_RUNNING,  // 运行状态
    FSM_STATE_SPENDING, // 等待状态
    FSM_STATE_DELAY,    // 延时状态
} event_fsm_state_t;
typedef struct event_fsm
{
    ringbuf_t evtq;                  // 事件队列
    _event_fsm_evt evt_table;        // 事件表
    event_fsm_state_t current_state; // 当前状态
    event_fsm_handler_t handler;     // 状态处理函数
    void *context;                   // 上下文数据
    void *user_data;                 // 用户数据
    soft_timer_t timer;              // 软定时器
} _event_fsm_t, *event_fsm_t;

void event_fsm_init(event_fsm_t fsm, uint8_t evtq_size, void *user_data)
{
    if (fsm == NULL || handler == NULL)
        return;
    // 初始化事件队列
    fsm->evtq = ringbuf_init(0); // 根据实际需要初始化环形缓冲区
    fsm->current_state = FSM_STATE_IDLE;
    fsm->handler = handler;
    fsm->context = context;
    fsm->user_data = user_data;
    // 初始化软定时器为NULL
    // TODO: 根据实际需要实现软定时器的初始化代码
}

//发送事件到状态机
int event_fsm_send_evt(event_fsm_t fsm, uint32_t evt)
{
    if (fsm == NULL)
        return err_invalid_obj; // 错误：无效的状态机或事件队列

    ringbuf_put(fsm->evtq, evt); // 将事件放入事件队列

    if (fsm->current_state != FSM_STATE_RUNNING)
    {
        if (!wait_delay) // 如果不需要等待延时，则直接切换到运行状态
        {
            soft_timer_stop(fsm->timer); // 停止软定时器
            fsm->current_state = FSM_STATE_RUNNING; // 切换到运行状态
        }
    }
    return err_ok; // 成功发送事件
}

int event_fsm_delay(event_fsm_t fsm, uint32_t delay)
{
    if (fsm == NULL)
        return err_invalid_obj; // 错误：无效的状态机

    if (fsm->current_state != FSM_STATE_DELAY)
    {
        fsm->current_state = FSM_STATE_DELAY; // 切换到延时状态
        soft_timer_start(fsm->timer, delay); // 启动软定时器,延时时间设置为delay

    }
    else
    {
        soft_timer_stop(fsm->timer); // 如果已经处于延时状态，则重置软定时器
        soft_timer_start(fsm->timer, delay); // 重新启动软定时器
    }
    return err_ok; // 成功设置延时
}

#endif